/**
 * 文件模块控制器
 */
const BaseController = require('./base_controller.js');
const FileService = require('../service/file_service.js');
const FileModel = require('../model/file_model.js');
const timeHelper = require('../config/project_helpers_config').timeHelper;

class FileController extends BaseController {

	/**
	 * 构造函数
	 */
	constructor() {
		super();
	}

	/**
	 * 文件列表页 [接口: plm_file/list]
	 */
	async getFileList() {
		try {
			// 数据校验
			let rules = {
				projectId: 'string|name=项目ID',
				search: 'string|min:1|max:30|name=搜索条件',
				sortType: 'string|name=排序类型',
				sortVal: 'string|name=排序值',
				type: 'string|name=文件类型',
				tag: 'string|name=文件标签',
				page: 'must|int|default=1',
				size: 'int|default=20',
			};

			// 取得数据
			let input = this.validateData(rules);

			let service = new FileService();
			let result = await service.getFileList(input);

			// 数据格式化
			let list = result.list || [];
			for (let k = 0; k < list.length; k++) {
				if (list[k].createTime) {
					list[k].createTimeDesc = timeHelper.fmtDateCN(list[k].createTime);
				}
				
				if (list[k].updateTime) {
					list[k].updateTimeDesc = timeHelper.fmtDateCN(list[k].updateTime);
				}
			}

			return result;
		} catch (err) {
			console.error('获取文件列表失败', err);
			return {
				list: [],
				total: 0
			};
		}
	}

	/**
	 * 文件详情页 [接口: plm_file/detail]
	 */
	async getFileDetail() {
		// 数据校验
		let rules = {
			id: 'must|id',
		};

		// 取得数据
		let input = this.validateData(rules);

		let service = new FileService();
		let file = await service.getFileDetail(input.id);
		
		// 文件不存在时，返回规范的错误信息
		if (!file) {
			return { 
				code: -1, 
				message: '文件不存在或已被删除'
			};
		}
		
		if (file) {
			// 格式化时间
			if (file.createTime)
				file.createTimeDesc = timeHelper.fmtDateCN(file.createTime);
				
			if (file.updateTime)
				file.updateTimeDesc = timeHelper.fmtDateCN(file.updateTime);
		}

		return file;
	}

	/**
	 * 添加文件 [接口: plm_file/insert]
	 */
	async insertFile() {
		// 数据校验
		let rules = {
			projectId: 'must|string|name=项目ID',
			name: 'must|string|min:1|max:100|name=文件名',
			type: 'string|name=文件类型',
			tag: 'string|max:30|name=文件标签',
			desc: 'string|max:500|name=文件描述',
			fileID: 'must|string|name=文件ID',
			size: 'int|name=文件大小',
		};

		// 取得数据
		let input = this.validateData(rules);

		// 校验数据
		let errMsg = FileModel.validateFileData(input);
		if (errMsg) {
			return {
				code: -1,
				message: errMsg
			};
		}

		let service = new FileService();
		let result = await service.uploadFile(input);

		return result;
	}

	/**
	 * 编辑文件 [接口: plm_file/edit]
	 */
	async editFile() {
		// 数据校验
		let rules = {
			id: 'must|id',
			name: 'must|string|min:1|max:100|name=文件名',
			type: 'string|name=文件类型',
			tag: 'string|max:30|name=文件标签',
			desc: 'string|max:500|name=文件描述',
			sort: 'int|default=9999|name=排序号',
		};

		// 取得数据
		let input = this.validateData(rules);

		let service = new FileService();
		let result = await service.updateFile(input);

		return result;
	}

	/**
	 * 删除文件 [接口: plm_file/delete]
	 */
	async deleteFile() {
		// 数据校验
		let rules = {
			id: 'must|id',
		};

		// 取得数据
		let input = this.validateData(rules);

		let service = new FileService();
		let result = await service.deleteFile(input.id);

		return result;
	}

	/**
	 * 文件查看统计 [接口: plm_file/view]
	 */
	async viewFile() {
		// 数据校验
		let rules = {
			id: 'must|id',
		};

		// 取得数据
		let input = this.validateData(rules);

		let service = new FileService();
		await service.addViewCount(input.id);

		return {
			code: 0,
			message: 'success'
		};
	}

	/**
	 * 文件下载统计 [接口: plm_file/download]
	 */
	async downloadFile() {
		// 数据校验
		let rules = {
			id: 'must|id',
		};

		// 取得数据
		let input = this.validateData(rules);

		let service = new FileService();
		await service.addDownloadCount(input.id);

		return {
			code: 0,
			message: 'success'
		};
	}
}

module.exports = FileController; 